/**  
 * 项目名称: 客户中心
 * 包名: com.otc.uc.base.page
 * 文件名: Configuration.java
 * 作者: wangshiping
 * 版本: v1.0
 * 日期: 2015年10月30日 上午9:02:35
 */
package com.yinkgh.mybatis.base.page;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 类名称: Configuration 类描述: 读取jdbc.properties配置文件中的配置参数 创建人: wangshiping 创建时间:
 * 2015年10月30日 上午9:14:21 修改人: 修改时间: 修改备注:
 * 
 * @version v1.0.0
 * 
 */
public class Configuration {

	private static final String CONF_CLASSPATH = "/jdbc.properties";

	private static Log log = LogFactory.getLog(Configuration.class);
	private static Configuration instance = new Configuration();

	private volatile Properties configuration = new Properties();

	FileOutputStream os = null;

	/**
	 * 构造方法。
	 */
	private Configuration() {

		InputStream is = this.getClass().getResourceAsStream(CONF_CLASSPATH);

		if (is != null) {
			try {
				this.configuration.clear();
				this.configuration.load(is);
				log.info("Loading configuration ... OK");
			} catch (IOException e) {
				log.info("Loading configuration ... FAILED", e);
			} finally {
				try {
					is.close();
				} catch (Throwable t) {
				}
			}
		} else {
			log.info("Loading configuration ... FAILED(Configuration file is not found)");
		}
	}

	/**
	 * 获得Configuration实例。
	 * 
	 * @return Configuration实例
	 */
	public static Configuration getInstance() {

		return instance;
	}

	/**
	 * 获得配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public String getConfiguration(String key) {

		return this.configuration.getProperty(key);
	}

	/**
	 * 取得String类型的值，如果配置项不存在，则返回defaultValue
	 * 
	 * @param key
	 * @param defaultValue
	 * @return
	 */
	public String getStringValue(String key, String defaultValue) {
		String value = this.getConfiguration(key);
		if (value == null) {
			return defaultValue;
		} else {
			return value;
		}
	}

	public void setConfiguration(String key, String value) {
		this.configuration.setProperty(key, value);

	}

	public void store(String comments) {
		if (configuration != null) {
			try {
				String path = getClass().getResource(CONF_CLASSPATH).getPath();
				os = new FileOutputStream(path);
				configuration.store(os, comments);
			} catch (FileNotFoundException e) {
			} catch (IOException e) {
			} finally {
				if (os != null) {
					try {
						os.close();
					} catch (Exception ee) {
					}
				}
			}
		}
	}

	/**
	 * 获得整型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Integer getIntegerConfiguration(String key) {

		Integer result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				result = new Integer(Integer.parseInt(value));
			} catch (NumberFormatException nfe) {
			}
		}

		return result;
	}

	/**
	 * 获得短整型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Short getShortConfiguration(String key) {
		Short result = null;
		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				result = new Short(Short.parseShort(value));
			} catch (NumberFormatException nfe) {
			}
		}

		return result;
	}

	/**
	 * 获得长整型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Long getLongConfiguration(String key) {

		Long result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				result = new Long(Long.parseLong(value));
			} catch (NumberFormatException nfe) {
			}
		}

		return result;
	}

	/**
	 * 获得单精度浮点型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Float getFloatConfiguration(String key) {

		Float result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				result = new Float(Float.parseFloat(value));
			} catch (NumberFormatException nfe) {
			}
		}

		return result;
	}

	/**
	 * 获得双精度浮点型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Double getDoubleConfiguration(String key) {

		Double result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				result = new Double(Double.parseDouble(value));
			} catch (NumberFormatException nfe) {
			}
		}

		return result;
	}

	/**
	 * 获得布尔型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * 
	 * @return 配置项
	 */
	public Boolean getBooleanConfiguration(String key) {

		Boolean result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			if ("true".equalsIgnoreCase(value)) {
				result = new Boolean(true);
			} else if ("false".equalsIgnoreCase(value)) {
				result = new Boolean(false);
			}
		}

		return result;
	}

	/**
	 * 获得日期型配置项。
	 * 
	 * @param key
	 *            配置关键字
	 * @param pattern
	 *            日期字符串格式
	 * 
	 * @return 配置项
	 */
	public Date getDateConfiguration(String key, String pattern) {

		Date result = null;

		String value = this.configuration.getProperty(key);
		if ((value != null) && !"".equals(value)) {
			try {
				if ((pattern != null) && !"".equals(pattern)) {
					result = (new SimpleDateFormat(pattern)).parse(value);
				} else {
					result = (new SimpleDateFormat()).parse(value);
				}
			} catch (ParseException pe) {
			}
		}

		return result;
	}
}